package 中等.分类讨论;

/**
 * 字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串，
 * 编写一个函数判定它们是否只需要一次(或者零次)编辑。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/one-away-lcci/
 */
public class 一次编辑_01_05 {

    public static void main(String[] args) {

        System.out.println(oneEditAway("pale", "ple"));

    }

    /**
     * 分类讨论：
     * 当字符串长度一样时，相同索引位置只能一个不一样
     * 不一样时，较长的字符串只能跳过一个字符，其余字符相同
     *
     * @param first
     * @param second
     * @return
     */
    public static boolean oneEditAway(String first, String second) {
        if (Math.abs(first.length() - second.length()) > 1) {
            return false;
        }
        int diff = 0;
        // 分类讨论
        if (first.length() == second.length()) {
            for (int i = 0; i < first.length(); i++) {
                if (first.charAt(i) != second.charAt(i)) {
                    diff++;
                    if (diff > 1) return false;
                }
            }
        } else if (first.length() < second.length()) {
            return compare(first, second);
        } else {
            return compare(second, first);
        }
        return true;
    }

    // 较长的字符串只能跳过一个字符，其他字符必须相等
    private static boolean compare(String shortStr, String longStr) {
        int diff = 0;
        char[] shortChars = shortStr.toCharArray();
        char[] longChars = longStr.toCharArray();
        for (int i = 0; i < shortStr.length(); i++) {
            while (i < shortStr.length() && shortChars[i] != longChars[i + diff]) {
                diff++;
                if (diff > 1) return false;
            }
        }
        return true;
    }

}
